

/**
 * 增益技能计算
 * @param {*} fight_data 战斗数据
 * @param {*} src_unit 发起单位
 * @param {*} target_unit 目标单位
 * @param {*} skill_name 技能名称
 * @param {*} skill_level 技能等级
 * @returns 
 */
export function computing_buff_skill(fight_data, src_unit, target_unit, skill_name, skill_level, consummer = true) {
    console.debug(`增益技能计算开始 => 编号: ${src_unit["编号"]} 类型: ${src_unit["类型"]} 气血: ${src_unit["气血"]} 目标编号: ${target_unit["编号"] ? target_unit["编号"] : "无"} 技能：${skill_name}`);

    if (skill_level === undefined) {
        skill_level = G.FightUnitUtils.get_unit_skill_level(src_unit, skill_name);
    }

    let skill_data = G.SkillData.default[skill_name];

    // 寻找目标前的增益独立算法计算
    if (skill_data["增益独立算法"]) {
        let result = skill_data["增益独立算法"](fight_data, src_unit, target_unit);
        // 某些技能直接结束流程
        if (result === false) {
            return;
        }
    }

    let target_count = 1;

    if (skill_data["目标"]) {
        target_count = skill_data["目标"](fight_data, src_unit, target_unit, skill_level);
    } else {
        console.debug(`增益技能 ${skill_name} 未定义目标计算`);
    }

    let target_list = [];

    if (skill_data["指定对象"] === "自己") {
        target_list = [src_unit];
    } else if (skill_data["指定目标"]) {
        target_list = skill_data["指定目标"](fight_data, src_unit, target_unit, target_count);
    } else {
        target_list = G.FightUtils.get_friend_team_group_survive_unit(fight_data, src_unit, target_count);
    }

    target_count = target_list.length;

    if (target_count === 0) {
        console.debug(`增益技能计算 ===> 没有目标单位，跳过`);
        return false;
    }

    // 不是法宝技能则获取技能消耗数据
    if (consummer) {
        let consummer_value = 0;
        let consummer_type = "";
        if (skill_data && skill_data["消耗"]) {
            let res = skill_data["消耗"](fight_data, src_unit, target_count);
            if (res) {
                consummer_value = res[0];
                consummer_type = res[1];
            }
        }
        // 如果需要的消耗类型不够则行动失败
        if (!G.FightUnitUtils.excute_unit_skill_consummer(fight_data, src_unit, consummer_type, consummer_value, skill_name)) {
            fight_data["战斗流程"].push({ "流程": 6, "战斗提示": { "内容": "行动失败", "编号": src_unit["编号"] } });
            return;
        }
    }

    if (!fight_data["PK战斗"] && src_unit["类型"] === "玩家") {
        let count = src_unit["统计数据"]["施法"] || 0;
        src_unit["统计数据"]["施法"] = count + 1;
    }

    fight_data["战斗流程"].push({ "流程": 53, "攻击方": src_unit["编号"], "被攻击": [], "全屏": false, "提示": { "允许": true, "类型": "法术", "名称": `${src_unit["名称"]}使用了${skill_name}`, "编号": src_unit["编号"] }, "技能提示": { "内容": `【增益】${skill_name}`, "编号": src_unit["编号"] } });
    G.FightUtils.add_waiting_play_time(fight_data, 1, "增益技能");

    if (skill_data["特技"]) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["特技名称"] = skill_name;
    }

    //批量执行技能
    for (let index = 0; index < target_list.length; index++) {
        let target = target_list[index];
        if (target["法术状态"] && target["法术状态"]["超级永恒"]) {
            let data = 0;
            if (target["法术状态"]["超级永恒"]["可增回合"] > 0) {
                //增加100%持续回合数
                data = target["法术状态"]["超级永恒"]["回合"] * 2;
                if (data > target["法术状态"]["超级永恒"]["可增回合"]) {
                    data = target["法术状态"]["超级永恒"]["可增回合"];
                }
            }
            target["法术状态"]["超级永恒"]["回合"] = data;
        }
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["被攻击"][index] = { "编号": target["编号"], "特效": [skill_name] };
        if (skill_data["增益算法"]) {
            let result = skill_data["增益算法"](fight_data, src_unit, target_unit, skill_level, target_list, index);
            // 某些技能不需要统一加状态
            if (result !== false) {
                G.FightStatusUtils.add_unit_status(fight_data, src_unit, target, skill_name, skill_level)
            }
        } else {
            // 没有配置算法的技能直接给目标加个状态
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target, skill_name, skill_level)
        }
    }
    console.debug(`增益技能计算结束 => ${JSON.stringify(fight_data["战斗流程"])}`);
}


/**
 * 减益技能计算
 * @param {*} fight_data 战斗数据
 * @param {*} src_unit 发起单位
 * @param {*} target_unit 目标单位
 * @param {*} skill_name 技能名称
 * @param {*} skill_level 技能等级
 * @param {*} consummer 技能是否计算消耗
 * @returns 
 */
export function computing_debuff_skill(fight_data, src_unit, target_unit, skill_name, skill_level, consummer = true) {
    console.debug(`增益技能计算 => 编号: ${src_unit["编号"]} 类型: ${src_unit["类型"]} 气血: ${src_unit["气血"]} 目标编号: ${target_unit["编号"] ? target_unit["编号"] : "无"} 技能：${skill_name}`);
    if (skill_level === undefined) {
        skill_level = G.FightUnitUtils.get_unit_skill_level(src_unit, skill_name);
    }

    let target_count = 1;

    let skill_data = G.SkillData.default[skill_name];

    if (skill_data["目标"]) {
        target_count = skill_data["目标"](fight_data, src_unit, target_unit, skill_level);
    } else {
        console.debug(`减益技能 ${skill_name} 未定义目标计算`);
    }

    let target_list = G.FightUtils.get_enemy_team_group_survive_unit(fight_data, src_unit, target_unit, 5);

    target_count = target_list.length;

    if (target_count === 0) {
        console.debug(`减益技能计算 ===> 没有目标单位，跳过`);
        return false;
    }

    for (let index = 0; index < target_list.length; index++) {
        let target = target_list[index];
        if (target["法术状态"] && target["法术状态"]["分身术"] && target["法术状态"]["分身术"]["破解"] === undefined) {
            target["法术状态"]["分身术"]["破解"] = 1
            return;
        }
    }

    if (consummer) {
        let consummer_value = 0;
        let consummer_type = "";
        if (skill_data && skill_data["消耗"]) {
            let res = skill_data["消耗"](fight_data, src_unit, target_count);
            if (res) {
                consummer_value = res[0];
                consummer_type = res[1];
            }
        }
        // 如果需要的消耗类型不够则行动失败
        if (!G.FightUnitUtils.excute_unit_skill_consummer(fight_data, src_unit, consummer_type, consummer_value, skill_name)) {
            fight_data["战斗流程"].push({ "流程": 6, "战斗提示": { "内容": "行动失败", "编号": src_unit["编号"] } });
            return;
        }
    }

    if (!fight_data["PK战斗"] && src_unit["类型"] === "玩家") {
        let count = src_unit["统计数据"]["施法"] || 0;
        src_unit["统计数据"]["施法"] = count + 1;
    }

    fight_data["战斗流程"].push({ "流程": 53, "攻击方": src_unit["编号"], "被攻击": [], "全屏": false, "提示": { "允许": true, "类型": "法术", "名称": `${src_unit["名称"]}使用了${skill_name}`, "编号": src_unit["编号"] }, "技能提示": { "内容": `【减益】${skill_name}`, "编号": src_unit["编号"] } });
    G.FightUtils.add_waiting_play_time(fight_data, 1, "减益技能");

    let current_index = fight_data["战斗流程"].length - 1;

    if (skill_data["特技"]) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["特技名称"] = skill_name;
    }

    // 批量执行技能
    for (let index = 0; index < target_list.length; index++) {
        let target = target_list[index];
        fight_data["战斗流程"][current_index]["被攻击"][index] = { "编号": target["编号"], "特效": [skill_name] };
        if (skill_data["减益算法"]) {
            let result = skill_data["减益算法"](fight_data, src_unit, target_unit, skill_level, target_list, index);
            if (result === false) {
                return;
            }
        } else {
            // 没有配置算法的技能直接给目标加个状态
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target, skill_name, skill_level);
        }
    }
}

/**
 * 破变身
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 */
export function destory_bianshen(fight_data, src_unit, target_unit) {
    let skill_name = G.ItemUtils.bs_data[target_unit["变身数据"]]["技能"];
    let skill_data = G.SkillData.default[skill_name];

    // 从技能读取变身算法
    if (skill_data && skill_data["取消变身"]) {
        skill_data["取消变身"](target_unit);
    }

    let send_data = {
        "模型": target_unit["模型"],
        "染色方案": target_unit["染色方案"],
        "染色组": target_unit["染色组"],
        "炫彩": target_unit["炫彩"],
        "炫彩组": target_unit["炫彩组"],
        "锦衣": [],
    }

    let characters = _CharactersData.get(target_unit["id"]);

    if (characters["装备"][2] && characters["装备"][2] !== null) {
        send_data["武器"] = { "名称": characters["装备"][2]["名称"], "子类": characters["装备"][2]["子类"], "级别限制": characters["装备"][2]["级别限制"] };
    }

    for (let index = 0; index < characters["锦衣"].length; index++) {
        let data = characters["锦衣"][index];
        if (data !== null) {
            send_data["锦衣"].push(data["名称"]);
        }
    }

    fight_data["战斗流程"].push({ "流程": 710, "攻击方": src_unit["编号"], "被攻击": target_unit["编号"], "参数": send_data });
    G.FightUtils.add_waiting_play_time(fight_data, 1, "破变身");
}